package vip.liux.contracts.infrastructure.localmsg;

/**
 * 本地消息调用状态持有器
 * <p>
 * 通过 ThreadLocal 记录当前线程的本地消息调用层级计数，
 * 用于判断当前线程是否处于本地消息的调用链中，防止递归或重复调用。
 */
public class InvokeStatusHolder {
    /**
     * 线程本地变量，记录当前线程的本地消息调用计数
     */
    private static final ThreadLocal<Integer> INVOKE_COUNTER = ThreadLocal.withInitial(() -> 0);

    /**
     * 判断当前线程是否处于本地消息调用中
     *
     * @return true 表示当前线程正在本地消息调用链中
     */
    public static boolean inInvoke() {
        return INVOKE_COUNTER.get() > 0;
    }

    /**
     * 本地消息调用开始，计数加一
     * 用于支持嵌套调用场景
     */
    public static void startInvoke() {
        INVOKE_COUNTER.set(INVOKE_COUNTER.get() + 1);
    }

    /**
     * 本地消息调用结束，计数减一
     * 当计数归零时，移除 ThreadLocal，防止内存泄漏
     */
    public static void endInvoke() {
        int count = INVOKE_COUNTER.get();
        if (count > 0) {
            INVOKE_COUNTER.set(count - 1);
        }
        if (INVOKE_COUNTER.get() == 0) {
            INVOKE_COUNTER.remove();
        }
    }
}